{
 "metadata": {
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  },
  "orig_nbformat": 2,
  "kernelspec": {
   "name": "python383jvsc74a57bd0dca0ade3e726a953b501b15e8e990130d2b7799f14cfd9f4271676035ebe5511",
   "display_name": "Python 3.8.3 64-bit ('base': conda)"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2,
 "cells": [
  {
   "source": [
    "量子近似优化算法（quantum approximate optimization algorithm)QAOA[1](https://arxiv.org/pdf/1411.4028.pdf) 是基于量子绝热演化(quantum adiabatic algorithm)QAA[2](https://arxiv.org/pdf/quant-ph/0001106.pdf) 构建的量子优化算法。QAOA主要用来求解最大割问题。下面我们将通过MindQuantum求解14个qubits的3-regular图的最大割问题来说明QAOA算法。"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "QAOA需要建立两个Hamilton量，其中一个哈密顿量B的基态比较容易制备；另一个Hamilton量C的基态对应于问题的解。系统整体的演化相当于从Hamilton量B的基态演化到Hamilton量C的基态，这个演化过程与QAA类似。最后通过对系统进行测量得到问题的解。"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import networkx as nx\n",
    "import matplotlib.pyplot as plt\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Created with matplotlib (https://matplotlib.org/) -->\n<svg height=\"302.4pt\" version=\"1.1\" viewBox=\"0 0 446.4 302.4\" width=\"446.4pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <defs>\n  <style type=\"text/css\">\n*{stroke-linecap:butt;stroke-linejoin:round;}\n  </style>\n </defs>\n <g id=\"figure_1\">\n  <g id=\"patch_1\">\n   <path d=\"M 0 302.4 \nL 446.4 302.4 \nL 446.4 0 \nL 0 0 \nz\n\" style=\"fill:#ffffff;\"/>\n  </g>\n  <g id=\"axes_1\">\n   <g id=\"LineCollection_1\">\n    <path clip-path=\"url(#pf5d65302ab)\" d=\"M 333.928692 20.290909 \nL 419.563636 223.373743 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#pf5d65302ab)\" d=\"M 333.928692 20.290909 \nL 26.836364 79.026257 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#pf5d65302ab)\" d=\"M 419.563636 223.373743 \nL 112.471308 282.109091 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#pf5d65302ab)\" d=\"M 26.836364 79.026257 \nL 112.471308 282.109091 \n\" style=\"fill:none;stroke:#000000;\"/>\n   </g>\n   <g id=\"PathCollection_1\">\n    <defs>\n     <path d=\"M 0 8.660254 \nC 2.296726 8.660254 4.499694 7.747755 6.123724 6.123724 \nC 7.747755 4.499694 8.660254 2.296726 8.660254 0 \nC 8.660254 -2.296726 7.747755 -4.499694 6.123724 -6.123724 \nC 4.499694 -7.747755 2.296726 -8.660254 0 -8.660254 \nC -2.296726 -8.660254 -4.499694 -7.747755 -6.123724 -6.123724 \nC -7.747755 -4.499694 -8.660254 -2.296726 -8.660254 0 \nC -8.660254 2.296726 -7.747755 4.499694 -6.123724 6.123724 \nC -4.499694 7.747755 -2.296726 8.660254 0 8.660254 \nz\n\" id=\"mbf465ccc17\" style=\"stroke:#1f78b4;\"/>\n    </defs>\n    <g clip-path=\"url(#pf5d65302ab)\">\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"333.928692\" xlink:href=\"#mbf465ccc17\" y=\"20.290909\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"419.563636\" xlink:href=\"#mbf465ccc17\" y=\"223.373743\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"26.836364\" xlink:href=\"#mbf465ccc17\" y=\"79.026257\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"112.471308\" xlink:href=\"#mbf465ccc17\" y=\"282.109091\"/>\n    </g>\n   </g>\n   <g id=\"text_1\">\n    <g clip-path=\"url(#pf5d65302ab)\">\n     <!-- 2 -->\n     <defs>\n      <path d=\"M 28.8125 13.8125 \nL 60.890625 13.8125 \nL 60.890625 0 \nL 7.90625 0 \nL 7.90625 13.8125 \nL 34.515625 37.3125 \nQ 38.09375 40.53125 39.796875 43.609375 \nQ 41.5 46.6875 41.5 50 \nQ 41.5 55.125 38.0625 58.25 \nQ 34.625 61.375 28.90625 61.375 \nQ 24.515625 61.375 19.28125 59.5 \nQ 14.0625 57.625 8.109375 53.90625 \nL 8.109375 69.921875 \nQ 14.453125 72.015625 20.65625 73.109375 \nQ 26.859375 74.21875 32.8125 74.21875 \nQ 45.90625 74.21875 53.15625 68.453125 \nQ 60.40625 62.703125 60.40625 52.390625 \nQ 60.40625 46.4375 57.328125 41.28125 \nQ 54.25 36.140625 44.390625 27.484375 \nz\n\" id=\"DejaVuSans-Bold-50\"/>\n     </defs>\n     <g transform=\"translate(329.754005 23.602159)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-50\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_2\">\n    <g clip-path=\"url(#pf5d65302ab)\">\n     <!-- 3 -->\n     <defs>\n      <path d=\"M 46.578125 39.3125 \nQ 53.953125 37.40625 57.78125 32.6875 \nQ 61.625 27.984375 61.625 20.703125 \nQ 61.625 9.859375 53.3125 4.21875 \nQ 45.015625 -1.421875 29.109375 -1.421875 \nQ 23.484375 -1.421875 17.84375 -0.515625 \nQ 12.203125 0.390625 6.6875 2.203125 \nL 6.6875 16.703125 \nQ 11.96875 14.0625 17.15625 12.71875 \nQ 22.359375 11.375 27.390625 11.375 \nQ 34.859375 11.375 38.84375 13.953125 \nQ 42.828125 16.546875 42.828125 21.390625 \nQ 42.828125 26.375 38.75 28.9375 \nQ 34.671875 31.5 26.703125 31.5 \nL 19.1875 31.5 \nL 19.1875 43.609375 \nL 27.09375 43.609375 \nQ 34.1875 43.609375 37.640625 45.828125 \nQ 41.109375 48.046875 41.109375 52.59375 \nQ 41.109375 56.78125 37.734375 59.078125 \nQ 34.375 61.375 28.21875 61.375 \nQ 23.6875 61.375 19.046875 60.34375 \nQ 14.40625 59.328125 9.8125 57.328125 \nL 9.8125 71.09375 \nQ 15.375 72.65625 20.84375 73.4375 \nQ 26.3125 74.21875 31.59375 74.21875 \nQ 45.796875 74.21875 52.84375 69.546875 \nQ 59.90625 64.890625 59.90625 55.515625 \nQ 59.90625 49.125 56.53125 45.046875 \nQ 53.171875 40.96875 46.578125 39.3125 \nz\n\" id=\"DejaVuSans-Bold-51\"/>\n     </defs>\n     <g transform=\"translate(415.388949 226.684993)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-51\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_3\">\n    <g clip-path=\"url(#pf5d65302ab)\">\n     <!-- 0 -->\n     <defs>\n      <path d=\"M 46 36.53125 \nQ 46 50.203125 43.4375 55.78125 \nQ 40.875 61.375 34.8125 61.375 \nQ 28.765625 61.375 26.171875 55.78125 \nQ 23.578125 50.203125 23.578125 36.53125 \nQ 23.578125 22.703125 26.171875 17.03125 \nQ 28.765625 11.375 34.8125 11.375 \nQ 40.828125 11.375 43.40625 17.03125 \nQ 46 22.703125 46 36.53125 \nz\nM 64.796875 36.375 \nQ 64.796875 18.265625 56.984375 8.421875 \nQ 49.171875 -1.421875 34.8125 -1.421875 \nQ 20.40625 -1.421875 12.59375 8.421875 \nQ 4.78125 18.265625 4.78125 36.375 \nQ 4.78125 54.546875 12.59375 64.375 \nQ 20.40625 74.21875 34.8125 74.21875 \nQ 49.171875 74.21875 56.984375 64.375 \nQ 64.796875 54.546875 64.796875 36.375 \nz\n\" id=\"DejaVuSans-Bold-48\"/>\n     </defs>\n     <g transform=\"translate(22.661676 82.337507)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-48\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_4\">\n    <g clip-path=\"url(#pf5d65302ab)\">\n     <!-- 1 -->\n     <defs>\n      <path d=\"M 11.71875 12.984375 \nL 28.328125 12.984375 \nL 28.328125 60.109375 \nL 11.28125 56.59375 \nL 11.28125 69.390625 \nL 28.21875 72.90625 \nL 46.09375 72.90625 \nL 46.09375 12.984375 \nL 62.703125 12.984375 \nL 62.703125 0 \nL 11.71875 0 \nz\n\" id=\"DejaVuSans-Bold-49\"/>\n     </defs>\n     <g transform=\"translate(108.29662 285.420341)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-49\"/>\n     </g>\n    </g>\n   </g>\n  </g>\n </g>\n <defs>\n  <clipPath id=\"pf5d65302ab\">\n   <rect height=\"288\" width=\"432\" x=\"7.2\" y=\"7.2\"/>\n  </clipPath>\n </defs>\n</svg>\n",
      "image/png": "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\n"
     },
     "metadata": {}
    }
   ],
   "source": [
    "g=nx.random_regular_graph(2,4,seed=7)\n",
    "list(g)\n",
    "nx.draw(g,with_labels=True,font_weight='bold')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "[2, 3, 0, 1] [(2, 3), (2, 0), (3, 1), (0, 1)] 4 4\n"
     ]
    }
   ],
   "source": [
    "print(g.nodes, g.edges, g.number_of_nodes(), g.number_of_edges())"
   ]
  },
  {
   "source": [
    "下面，我们来用4个格点的2-regular图来说明最大割问题。\n",
    "\n",
    "在上图中，每个格点都有两条线与其他格点相连，每个连接的权重都设置为1。最大割问题就是将格点分成两组，使得两组格点间连接的权重和最大。将4个格点分成两组，有三种分法：\\[0，4\\]，\\[1，3\\]，\\[2，2\\]。\\[0，4\\]分法将4个格点分为一组，另一组0个格点，这种分法权重和为0；\\[1，3\\]分法将1个格点分为一组，另外三个格点分为一组，我们取任意一个格点作为一组的结果都是一样的，比如取0作为一组，权重和为2（两个条连线分别为（0，1）和（0，2））；\\[2,2\\]分法有两种方式，一种是将相邻的两个格点分为一组，比如说将0，1分为一组，权重和为2（两条连线分别为（0，2），（1，3）），另一种分法是将对角的格点分为一组：0，3一组，1，2另一组，此时的权重为4（4条连线分别为（0，1），（0，2），（3，1），（3，2））。最大割问题就是在任意的一个图中找到这种权重和最大的分割。\n",
    "\n",
    "经典算法对于这种连线规则的图来说，最大割很容易计算得到，对于连线不规则的图，求解最大割问题的复杂度是NP的。"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Created with matplotlib (https://matplotlib.org/) -->\n<svg height=\"302.4pt\" version=\"1.1\" viewBox=\"0 0 446.4 302.4\" width=\"446.4pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <defs>\n  <style type=\"text/css\">\n*{stroke-linecap:butt;stroke-linejoin:round;}\n  </style>\n </defs>\n <g id=\"figure_1\">\n  <g id=\"patch_1\">\n   <path d=\"M 0 302.4 \nL 446.4 302.4 \nL 446.4 0 \nL 0 0 \nz\n\" style=\"fill:#ffffff;\"/>\n  </g>\n  <g id=\"axes_1\">\n   <g id=\"LineCollection_1\">\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 266.745566 250.801284 \nL 402.344022 257.333436 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 266.745566 250.801284 \nL 289.295429 187.93242 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 266.745566 250.801284 \nL 154.061968 240.092394 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 402.344022 257.333436 \nL 419.563636 168.812067 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 402.344022 257.333436 \nL 305.032745 282.109091 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 225.537841 117.104743 \nL 90.322319 90.886709 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 225.537841 117.104743 \nL 315.12572 85.086811 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 225.537841 117.104743 \nL 289.295429 187.93242 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 90.322319 90.886709 \nL 55.578643 20.290909 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 90.322319 90.886709 \nL 49.049602 152.059998 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 26.836364 64.954613 \nL 164.442997 32.577417 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 26.836364 64.954613 \nL 55.578643 20.290909 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 26.836364 64.954613 \nL 49.049602 152.059998 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 164.442997 32.577417 \nL 315.12572 85.086811 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 164.442997 32.577417 \nL 55.578643 20.290909 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 305.032745 282.109091 \nL 154.061968 240.092394 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 305.032745 282.109091 \nL 386.77874 222.300598 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 154.061968 240.092394 \nL 49.049602 152.059998 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 289.295429 187.93242 \nL 386.77874 222.300598 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 419.563636 168.812067 \nL 386.77874 222.300598 \n\" style=\"fill:none;stroke:#000000;\"/>\n    <path clip-path=\"url(#paef85d8e48)\" d=\"M 419.563636 168.812067 \nL 315.12572 85.086811 \n\" style=\"fill:none;stroke:#000000;\"/>\n   </g>\n   <g id=\"PathCollection_1\">\n    <defs>\n     <path d=\"M 0 8.660254 \nC 2.296726 8.660254 4.499694 7.747755 6.123724 6.123724 \nC 7.747755 4.499694 8.660254 2.296726 8.660254 0 \nC 8.660254 -2.296726 7.747755 -4.499694 6.123724 -6.123724 \nC 4.499694 -7.747755 2.296726 -8.660254 0 -8.660254 \nC -2.296726 -8.660254 -4.499694 -7.747755 -6.123724 -6.123724 \nC -7.747755 -4.499694 -8.660254 -2.296726 -8.660254 0 \nC -8.660254 2.296726 -7.747755 4.499694 -6.123724 6.123724 \nC -4.499694 7.747755 -2.296726 8.660254 0 8.660254 \nz\n\" id=\"m65dfce1a46\" style=\"stroke:#1f78b4;\"/>\n    </defs>\n    <g clip-path=\"url(#paef85d8e48)\">\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"266.745566\" xlink:href=\"#m65dfce1a46\" y=\"250.801284\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"402.344022\" xlink:href=\"#m65dfce1a46\" y=\"257.333436\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"225.537841\" xlink:href=\"#m65dfce1a46\" y=\"117.104743\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"90.322319\" xlink:href=\"#m65dfce1a46\" y=\"90.886709\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"26.836364\" xlink:href=\"#m65dfce1a46\" y=\"64.954613\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"164.442997\" xlink:href=\"#m65dfce1a46\" y=\"32.577417\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"55.578643\" xlink:href=\"#m65dfce1a46\" y=\"20.290909\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"305.032745\" xlink:href=\"#m65dfce1a46\" y=\"282.109091\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"154.061968\" xlink:href=\"#m65dfce1a46\" y=\"240.092394\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"49.049602\" xlink:href=\"#m65dfce1a46\" y=\"152.059998\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"289.295429\" xlink:href=\"#m65dfce1a46\" y=\"187.93242\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"419.563636\" xlink:href=\"#m65dfce1a46\" y=\"168.812067\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"386.77874\" xlink:href=\"#m65dfce1a46\" y=\"222.300598\"/>\n     <use style=\"fill:#1f78b4;stroke:#1f78b4;\" x=\"315.12572\" xlink:href=\"#m65dfce1a46\" y=\"85.086811\"/>\n    </g>\n   </g>\n   <g id=\"text_1\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 4 -->\n     <defs>\n      <path d=\"M 36.8125 57.421875 \nL 16.21875 26.90625 \nL 36.8125 26.90625 \nz\nM 33.6875 72.90625 \nL 54.59375 72.90625 \nL 54.59375 26.90625 \nL 64.984375 26.90625 \nL 64.984375 13.28125 \nL 54.59375 13.28125 \nL 54.59375 0 \nL 36.8125 0 \nL 36.8125 13.28125 \nL 4.5 13.28125 \nL 4.5 29.390625 \nz\n\" id=\"DejaVuSans-Bold-52\"/>\n     </defs>\n     <g transform=\"translate(262.570879 254.112534)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-52\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_2\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 6 -->\n     <defs>\n      <path d=\"M 36.1875 35.984375 \nQ 31.25 35.984375 28.78125 32.78125 \nQ 26.3125 29.59375 26.3125 23.1875 \nQ 26.3125 16.796875 28.78125 13.59375 \nQ 31.25 10.40625 36.1875 10.40625 \nQ 41.15625 10.40625 43.625 13.59375 \nQ 46.09375 16.796875 46.09375 23.1875 \nQ 46.09375 29.59375 43.625 32.78125 \nQ 41.15625 35.984375 36.1875 35.984375 \nz\nM 59.421875 71 \nL 59.421875 57.515625 \nQ 54.78125 59.71875 50.671875 60.765625 \nQ 46.578125 61.8125 42.671875 61.8125 \nQ 34.28125 61.8125 29.59375 57.140625 \nQ 24.90625 52.484375 24.125 43.3125 \nQ 27.34375 45.703125 31.09375 46.890625 \nQ 34.859375 48.09375 39.3125 48.09375 \nQ 50.484375 48.09375 57.34375 41.546875 \nQ 64.203125 35.015625 64.203125 24.421875 \nQ 64.203125 12.703125 56.53125 5.640625 \nQ 48.875 -1.421875 35.984375 -1.421875 \nQ 21.78125 -1.421875 13.984375 8.171875 \nQ 6.203125 17.78125 6.203125 35.40625 \nQ 6.203125 53.46875 15.3125 63.796875 \nQ 24.421875 74.125 40.28125 74.125 \nQ 45.3125 74.125 50.046875 73.34375 \nQ 54.78125 72.5625 59.421875 71 \nz\n\" id=\"DejaVuSans-Bold-54\"/>\n     </defs>\n     <g transform=\"translate(398.169334 260.644686)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-54\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_3\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 3 -->\n     <defs>\n      <path d=\"M 46.578125 39.3125 \nQ 53.953125 37.40625 57.78125 32.6875 \nQ 61.625 27.984375 61.625 20.703125 \nQ 61.625 9.859375 53.3125 4.21875 \nQ 45.015625 -1.421875 29.109375 -1.421875 \nQ 23.484375 -1.421875 17.84375 -0.515625 \nQ 12.203125 0.390625 6.6875 2.203125 \nL 6.6875 16.703125 \nQ 11.96875 14.0625 17.15625 12.71875 \nQ 22.359375 11.375 27.390625 11.375 \nQ 34.859375 11.375 38.84375 13.953125 \nQ 42.828125 16.546875 42.828125 21.390625 \nQ 42.828125 26.375 38.75 28.9375 \nQ 34.671875 31.5 26.703125 31.5 \nL 19.1875 31.5 \nL 19.1875 43.609375 \nL 27.09375 43.609375 \nQ 34.1875 43.609375 37.640625 45.828125 \nQ 41.109375 48.046875 41.109375 52.59375 \nQ 41.109375 56.78125 37.734375 59.078125 \nQ 34.375 61.375 28.21875 61.375 \nQ 23.6875 61.375 19.046875 60.34375 \nQ 14.40625 59.328125 9.8125 57.328125 \nL 9.8125 71.09375 \nQ 15.375 72.65625 20.84375 73.4375 \nQ 26.3125 74.21875 31.59375 74.21875 \nQ 45.796875 74.21875 52.84375 69.546875 \nQ 59.90625 64.890625 59.90625 55.515625 \nQ 59.90625 49.125 56.53125 45.046875 \nQ 53.171875 40.96875 46.578125 39.3125 \nz\n\" id=\"DejaVuSans-Bold-51\"/>\n     </defs>\n     <g transform=\"translate(221.363153 120.415993)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-51\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_4\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 13 -->\n     <defs>\n      <path d=\"M 11.71875 12.984375 \nL 28.328125 12.984375 \nL 28.328125 60.109375 \nL 11.28125 56.59375 \nL 11.28125 69.390625 \nL 28.21875 72.90625 \nL 46.09375 72.90625 \nL 46.09375 12.984375 \nL 62.703125 12.984375 \nL 62.703125 0 \nL 11.71875 0 \nz\n\" id=\"DejaVuSans-Bold-49\"/>\n     </defs>\n     <g transform=\"translate(81.972944 94.197959)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-49\"/>\n      <use x=\"69.580078\" xlink:href=\"#DejaVuSans-Bold-51\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_5\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 0 -->\n     <defs>\n      <path d=\"M 46 36.53125 \nQ 46 50.203125 43.4375 55.78125 \nQ 40.875 61.375 34.8125 61.375 \nQ 28.765625 61.375 26.171875 55.78125 \nQ 23.578125 50.203125 23.578125 36.53125 \nQ 23.578125 22.703125 26.171875 17.03125 \nQ 28.765625 11.375 34.8125 11.375 \nQ 40.828125 11.375 43.40625 17.03125 \nQ 46 22.703125 46 36.53125 \nz\nM 64.796875 36.375 \nQ 64.796875 18.265625 56.984375 8.421875 \nQ 49.171875 -1.421875 34.8125 -1.421875 \nQ 20.40625 -1.421875 12.59375 8.421875 \nQ 4.78125 18.265625 4.78125 36.375 \nQ 4.78125 54.546875 12.59375 64.375 \nQ 20.40625 74.21875 34.8125 74.21875 \nQ 49.171875 74.21875 56.984375 64.375 \nQ 64.796875 54.546875 64.796875 36.375 \nz\n\" id=\"DejaVuSans-Bold-48\"/>\n     </defs>\n     <g transform=\"translate(22.661676 68.265863)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-48\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_6\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 5 -->\n     <defs>\n      <path d=\"M 10.59375 72.90625 \nL 57.328125 72.90625 \nL 57.328125 59.078125 \nL 25.59375 59.078125 \nL 25.59375 47.796875 \nQ 27.734375 48.390625 29.90625 48.703125 \nQ 32.078125 49.03125 34.421875 49.03125 \nQ 47.75 49.03125 55.171875 42.359375 \nQ 62.59375 35.6875 62.59375 23.78125 \nQ 62.59375 11.96875 54.515625 5.265625 \nQ 46.4375 -1.421875 32.078125 -1.421875 \nQ 25.875 -1.421875 19.796875 -0.21875 \nQ 13.71875 0.984375 7.71875 3.421875 \nL 7.71875 18.21875 \nQ 13.671875 14.796875 19.015625 13.078125 \nQ 24.359375 11.375 29.109375 11.375 \nQ 35.9375 11.375 39.859375 14.71875 \nQ 43.796875 18.0625 43.796875 23.78125 \nQ 43.796875 29.546875 39.859375 32.859375 \nQ 35.9375 36.1875 29.109375 36.1875 \nQ 25.046875 36.1875 20.453125 35.125 \nQ 15.875 34.078125 10.59375 31.890625 \nz\n\" id=\"DejaVuSans-Bold-53\"/>\n     </defs>\n     <g transform=\"translate(160.26831 35.888667)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-53\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_7\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 8 -->\n     <defs>\n      <path d=\"M 34.8125 32.625 \nQ 29.546875 32.625 26.703125 29.734375 \nQ 23.875 26.859375 23.875 21.484375 \nQ 23.875 16.109375 26.703125 13.25 \nQ 29.546875 10.40625 34.8125 10.40625 \nQ 40.046875 10.40625 42.828125 13.25 \nQ 45.609375 16.109375 45.609375 21.484375 \nQ 45.609375 26.90625 42.828125 29.765625 \nQ 40.046875 32.625 34.8125 32.625 \nz\nM 21.09375 38.8125 \nQ 14.453125 40.828125 11.078125 44.96875 \nQ 7.71875 49.125 7.71875 55.328125 \nQ 7.71875 64.546875 14.59375 69.375 \nQ 21.484375 74.21875 34.8125 74.21875 \nQ 48.046875 74.21875 54.921875 69.40625 \nQ 61.8125 64.59375 61.8125 55.328125 \nQ 61.8125 49.125 58.421875 44.96875 \nQ 55.03125 40.828125 48.390625 38.8125 \nQ 55.8125 36.765625 59.59375 32.15625 \nQ 63.375 27.546875 63.375 20.515625 \nQ 63.375 9.671875 56.171875 4.125 \nQ 48.96875 -1.421875 34.8125 -1.421875 \nQ 20.609375 -1.421875 13.359375 4.125 \nQ 6.109375 9.671875 6.109375 20.515625 \nQ 6.109375 27.546875 9.890625 32.15625 \nQ 13.671875 36.765625 21.09375 38.8125 \nz\nM 25.484375 53.421875 \nQ 25.484375 49.078125 27.90625 46.734375 \nQ 30.328125 44.390625 34.8125 44.390625 \nQ 39.203125 44.390625 41.59375 46.734375 \nQ 44 49.078125 44 53.421875 \nQ 44 57.765625 41.59375 60.078125 \nQ 39.203125 62.40625 34.8125 62.40625 \nQ 30.328125 62.40625 27.90625 60.0625 \nQ 25.484375 57.71875 25.484375 53.421875 \nz\n\" id=\"DejaVuSans-Bold-56\"/>\n     </defs>\n     <g transform=\"translate(51.403955 23.602159)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-56\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_8\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 9 -->\n     <defs>\n      <path d=\"M 10.015625 1.609375 \nL 10.015625 15.09375 \nQ 14.5 12.984375 18.59375 11.9375 \nQ 22.703125 10.890625 26.703125 10.890625 \nQ 35.109375 10.890625 39.796875 15.546875 \nQ 44.484375 20.21875 45.3125 29.390625 \nQ 42 26.953125 38.234375 25.734375 \nQ 34.46875 24.515625 30.078125 24.515625 \nQ 18.890625 24.515625 12.03125 31.03125 \nQ 5.171875 37.546875 5.171875 48.1875 \nQ 5.171875 59.96875 12.8125 67.046875 \nQ 20.453125 74.125 33.296875 74.125 \nQ 47.5625 74.125 55.375 64.5 \nQ 63.1875 54.890625 63.1875 37.3125 \nQ 63.1875 19.234375 54.046875 8.90625 \nQ 44.921875 -1.421875 29 -1.421875 \nQ 23.875 -1.421875 19.1875 -0.65625 \nQ 14.5 0.09375 10.015625 1.609375 \nz\nM 33.203125 36.71875 \nQ 38.140625 36.71875 40.625 39.90625 \nQ 43.109375 43.109375 43.109375 49.515625 \nQ 43.109375 55.859375 40.625 59.078125 \nQ 38.140625 62.3125 33.203125 62.3125 \nQ 28.265625 62.3125 25.78125 59.078125 \nQ 23.296875 55.859375 23.296875 49.515625 \nQ 23.296875 43.109375 25.78125 39.90625 \nQ 28.265625 36.71875 33.203125 36.71875 \nz\n\" id=\"DejaVuSans-Bold-57\"/>\n     </defs>\n     <g transform=\"translate(300.858058 285.420341)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-57\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_9\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 10 -->\n     <g transform=\"translate(145.712593 243.403644)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-49\"/>\n      <use x=\"69.580078\" xlink:href=\"#DejaVuSans-Bold-48\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_10\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 1 -->\n     <g transform=\"translate(44.874914 155.371248)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-49\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_11\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 2 -->\n     <defs>\n      <path d=\"M 28.8125 13.8125 \nL 60.890625 13.8125 \nL 60.890625 0 \nL 7.90625 0 \nL 7.90625 13.8125 \nL 34.515625 37.3125 \nQ 38.09375 40.53125 39.796875 43.609375 \nQ 41.5 46.6875 41.5 50 \nQ 41.5 55.125 38.0625 58.25 \nQ 34.625 61.375 28.90625 61.375 \nQ 24.515625 61.375 19.28125 59.5 \nQ 14.0625 57.625 8.109375 53.90625 \nL 8.109375 69.921875 \nQ 14.453125 72.015625 20.65625 73.109375 \nQ 26.859375 74.21875 32.8125 74.21875 \nQ 45.90625 74.21875 53.15625 68.453125 \nQ 60.40625 62.703125 60.40625 52.390625 \nQ 60.40625 46.4375 57.328125 41.28125 \nQ 54.25 36.140625 44.390625 27.484375 \nz\n\" id=\"DejaVuSans-Bold-50\"/>\n     </defs>\n     <g transform=\"translate(285.120742 191.24367)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-50\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_12\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 7 -->\n     <defs>\n      <path d=\"M 6.6875 72.90625 \nL 61.625 72.90625 \nL 61.625 62.3125 \nL 33.203125 0 \nL 14.890625 0 \nL 41.796875 59.078125 \nL 6.6875 59.078125 \nz\n\" id=\"DejaVuSans-Bold-55\"/>\n     </defs>\n     <g transform=\"translate(415.388949 172.123317)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-55\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_13\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 12 -->\n     <g transform=\"translate(378.429365 225.611848)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-49\"/>\n      <use x=\"69.580078\" xlink:href=\"#DejaVuSans-Bold-50\"/>\n     </g>\n    </g>\n   </g>\n   <g id=\"text_14\">\n    <g clip-path=\"url(#paef85d8e48)\">\n     <!-- 11 -->\n     <g transform=\"translate(306.776345 88.398061)scale(0.12 -0.12)\">\n      <use xlink:href=\"#DejaVuSans-Bold-49\"/>\n      <use x=\"69.580078\" xlink:href=\"#DejaVuSans-Bold-49\"/>\n     </g>\n    </g>\n   </g>\n  </g>\n </g>\n <defs>\n  <clipPath id=\"paef85d8e48\">\n   <rect height=\"288\" width=\"432\" x=\"7.2\" y=\"7.2\"/>\n  </clipPath>\n </defs>\n</svg>\n",
      "image/png": "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\n"
     },
     "metadata": {}
    }
   ],
   "source": [
    "g=nx.random_regular_graph(3,14,seed=7)\n",
    "list(g)\n",
    "nx.draw(g,with_labels=True,font_weight='bold')"
   ]
  },
  {
   "source": [
    "在我们给出的3-regular无向图中，共有$0-13$个qubits，每个qubits都和周围的个qubits建立连接，每个连接的权重都设置为1。求这个图的最大割。"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "首先给出算符B和C的定义：\n",
    "\\begin{equation}\n",
    "C=\\sum_{j<k}w_{jk} Z_jZ_k \\\\\n",
    "B=\\sum_j X_j\n",
    "\\end{equation}\n",
    "X和Y分别是泡利-x和泡利-y算符，$w_{jk}$表示连接的权重（可以为任意的实数，0的时候表示两点之间没有连接）。B算符的基态就是均匀叠加态（或者整体相差一个$\\pi$相位），这是容易制备的。C算符的基态编码了要求问题的解。\n",
    "\n",
    "通过优化算法寻找算符C的基态，这使得权重是正的连线对应的两个点倾向于选取不同的值，权重是负的连线对应的两个点倾向于选取相同的值。\n",
    "\n",
    "最后当算符C取到极小值的时候，通过使用($|0\\rangle,|1\\rangle$)基对系统进行测量。按照测量值分成两组（0值一组，1值一组），所得的分组就是问题的解。\n",
    "\n",
    "算符B和C对应的演化算符分别为：\n",
    "\\begin{equation}\n",
    "U_C(\\gamma)=e^{-i \\gamma C}=\\prod_{j<k} e^{-i \\gamma w_jk Z_jZ_k} \\\\\n",
    "U_B(\\beta)=e^{-i \\beta B}=\\prod_j e^{-i \\beta X_j}\n",
    "\\end{equation}\n",
    "其中，$\\gamma$和$\\beta$对应于演化时间。"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "将$U_BU_C$看做是一层QAOA操作，如果一个$p$层的QAOA操作可以定义为如下形式：\n",
    "\\begin{equation}\n",
    "|\\gamma,\\beta \\rangle = U_B(\\beta_p)U_C(\\gamma_p)...U_B(\\beta_1)U_C(\\gamma_1)|+\\rangle^{\\otimes n}\n",
    "\\end{equation}\n",
    "其中，$\\gamma=(\\gamma_1,...,\\gamma_p),\\beta=(\\beta_1,...,\\beta_p)$。\n",
    "\n",
    "\n",
    "$p$越大，QAOA的表示空间越大，最终的结果也会越接近算符C的基态。但同时会增加算法深度，门复杂度，测量次数。模拟中，我们发现，当$p=1$时，就可以得到一个比较好的结果。"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "Cost function定义\n",
    "\\begin{equation}\n",
    "\\langle C \\rangle =\\langle \\gamma,\\beta|C|\\gamma,\\beta\\rangle\n",
    "\\end{equation}\n",
    "通过经典优化算法（比如说梯度下降，单纯性法，鲍威尔方法等）求得$\\langle C\\rangle$的极小值。此时对应的参数$\\gamma,\\beta$为所要求的优化参数\n"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "最后给出我们所示3-regular图对应的算符B和C的具体形式：\n",
    "\\begin{equation}\n",
    "B=\\sum_{j=0}^{13} X_j \\\\\n",
    "C=Z_0 Z_1+Z_0 Z_{5}+Z_0 Z_{8}+Z_1 Z_{10}+Z_1 Z_{13}+Z_2 Z_3+Z_2 Z_4 \\\\\n",
    "+Z_2 Z_{12}+Z_3 Z_{11}+Z_3 Z_{13}+Z_4 Z_6+Z_4 Z_{10}+Z_5 Z_8+Z_5 Z_{11} \\\\\n",
    "+Z_6 Z_7 +Z_6 Z_{9}+Z_7 Z_{11} +Z_7 Z_{12}+Z_8 Z_{13}+Z_{9}Z_{10}+ Z_9 Z_{12}\n",
    "\\end{equation}"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "output_type": "error",
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'mindquantum'",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-7-5023252abe74>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mmindquantum\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mCircuit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mH\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mZZ\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mRX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mHamiltonian\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mmindquantum\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcircuit\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mUN\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mmindquantum\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnn\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mMindQuantumAnsatzOnlyLayer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgenerate_pqc_operator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgenerate_evolution_operator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mprojectq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mops\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mQubitOperator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mmindspore\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mTensor\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'mindquantum'"
     ]
    }
   ],
   "source": [
    "from mindquantum import Circuit, H, ZZ, X, RX, Hamiltonian\n",
    "from mindquantum.circuit import UN \n",
    "from mindquantum.nn import MindQuantumAnsatzOnlyLayer, generate_pqc_operator, generate_evolution_operator\n",
    "from projectq.ops import QubitOperator\n",
    "from mindspore import Tensor\n",
    "import mindspore.nn as nn\n",
    "import numpy as np \n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#获取比特数，即图的格点数\n",
    "def get_graph_max_node(graph):\n",
    "    return max([max(i) for i in graph])+1\n",
    "\n",
    "#对所有的比特做X旋转操作，构建算符B的演化\n",
    "def all_rx(n_qubits, name):\n",
    "    c = Circuit()\n",
    "    for i in range(n_qubits):\n",
    "        c += RX(f'b_{name}').on(i)\n",
    "    return c \n",
    "\n",
    "#对图中有连线的两个格点做ZZ旋转门操作，构建算符C的演化\n",
    "def network_zz(network, name):\n",
    "    c = Circuit()\n",
    "    for poi in network:\n",
    "        c += ZZ(f'g_{name}').on(poi)\n",
    "    return c\n",
    "\n",
    "#制备均匀叠加态\n",
    "def init_state_prepare(n_qubits):\n",
    "    return UN(H, range(n_qubits))\n",
    "\n",
    "#构建QAOA层，层数为p\n",
    "def qaoa_circuit(graph, p=1):\n",
    "    n=get_graph_max_node(graph)\n",
    "    circ = Circuit()\n",
    "    for l in range(p):\n",
    "        circ += network_zz(graph, l)\n",
    "        circ += all_rx(n, l)\n",
    "    return circ\n",
    "\n",
    "#构建算符哈密顿量（即算符C)，以求得Cost function的期望值\n",
    "def generate_hamiltonian(graph):\n",
    "    h = QubitOperator()\n",
    "    for p0, p1 in graph:\n",
    "        h += QubitOperator(f'Z{p0} Z{p1}')\n",
    "    return Hamiltonian(h)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#定义图结构，每个括号中的两个节点有连接，这是一个3-regular图\n",
    "graph = [(0,1), (0,5), (0,8), (1,10), (1,13), (2,3), (2,4),\n",
    "         (2,12), (3,11), (3,13), (4,6), (4,10), (5,8), (5,11),\n",
    "         (6,7), (6,9), (7,11), (7,12), (8,13), (9,10), (9,12)]\n",
    "n=get_graph_max_node(graph)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "p = 1\n",
    "circ = init_state_prepare(n)\n",
    "circ += qaoa_circuit(graph, p)\n",
    "ham = generate_hamiltonian(graph)"
   ]
  },
  {
   "source": [
    "## 方法1"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "init_para = np.array([0.1, 0.1]*p).astype(np.float32)#初始参数\n",
    "pqc = MindQuantumAnsatzOnlyLayer(circ.para_name, circ, ham, Tensor(init_para))#生成参数化量子线路\n",
    "opti = nn.Adam(pqc.trainable_params(), learning_rate=0.5)#使用mindquantum中的优化算法求ham的基态\n",
    "train_net = nn.TrainOneStepCell(pqc, opti)#返回当前量子态下ham的均值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pqc.trainable_params()\n",
    "train_net()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(499):\n",
    "    print(i, train_net())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pqc(),pqc.weight.asnumpy()#返回对应的参数值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "state = pqc.final_state()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "bin(np.argmax(np.abs(state)**2))[2:].zfill(n)[::-1]#返回最优解\n"
   ]
  },
  {
   "source": [
    "## 方法2"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.optimize import minimize"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#定义方程，输出初始参数值和上述的参数化量子线路pqc的算符形式；输出哈密顿量（即算符C)在当前量子态下的均值\n",
    "def fun(para, pqc):\n",
    "    fake_data = Tensor(np.array([[0]]).astype(np.float32))\n",
    "    f,_,g = pqc(fake_data, Tensor(para.astype(np.float32)))\n",
    "    return f.asnumpy()[0,0], g.asnumpy()[0,0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "init_para = np.array([0.1, 0.1]*p).astype(np.float32)#初始化参数\n",
    "pqc = generate_pqc_operator([],circ.para_name, circ, ham)#将上述的量子线路pqc转化为算符形式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#选取合适的坐标范围，即两个参数的取值范围，以fun输出的函数值映射为颜色深浅来作图\n",
    "nn=100\n",
    "X_axis = np.linspace(-1,1,nn)\n",
    "Y_axis = np.linspace(-1.5,1.5,nn)\n",
    "V = np.zeros((nn,nn))\n",
    "for x in np.arange(nn):\n",
    "    print(x)\n",
    "    for y in np.arange(nn):\n",
    "        V[x][y] = fun(np.array([X_axis[x], Y_axis[y]]).astype(np.float32),pqc)[0]\n",
    "plt.pcolormesh(X_axis,Y_axis,V)\n",
    "plt.colorbar()\n",
    "plt.xlabel('Gamma')\n",
    "plt.ylabel('Beta')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "res = minimize(fun, init_para, args=(pqc,), method='bfgs',jac = True, options={'disp':True})#优化函数\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "state = generate_evolution_operator(circ)(Tensor(res.x.astype(np.float32)))#返回最终的量子态\n",
    "state"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "bin(np.argmax(np.abs(state)**2))[2:].zfill(n)[::-1]#返回最优解"
   ]
  }
 ]
}